package com.client.elements.canvas.tools;

import com.google.gwt.canvas.dom.client.Context2d;

public class Kreis {

	int radius;
	int x_Position, y_Position, x_Bewegung, y_Bewegung;

	int max_hoehe = 0;

	public int getPosition_X(){
		return this.x_Position;
	}

	public int getPosition_Y(){
		return this.y_Position;
	}

	public Kreis(int radius, int x_Position, int y_Position, int x_Bewegung, int y_Bewegung) {
		this.radius = radius;
		this.x_Position = x_Position;
		this.y_Position = y_Position;
		this.x_Bewegung = x_Bewegung;
		this.y_Bewegung = y_Bewegung;
	}

	public void update(Context2d front) {
		front.beginPath();
		this.draw(front);
		front.closePath();
		front.stroke();
	}

	public void update_bunt(Context2d front, String color) {
		front.beginPath();
		this.draw(front);
		front.setFillStyle(color);
		front.closePath();
		front.fill();
	}

	public void draw(Context2d front){
		{//Raender --> Richtung * -1
			if (x_Position + radius + x_Bewegung > 400 || x_Position - radius + x_Bewegung < 0) {
				x_Bewegung *= -1;
			}
			if (y_Position + radius + y_Bewegung > 400 || y_Position - radius + y_Bewegung < 0) {
				y_Bewegung *= -1;
			}
		}

		//Aenderung der Position
		x_Position += x_Bewegung;
		y_Position += y_Bewegung;

		front.arc(x_Position, y_Position, radius, 0, Math.PI * 2, true);
	}

	public void updateCirclesAroundMouse(Context2d front, int mouse_X, int mouse_Y, int radius_mouse){
		{//Wenn Kreise herausgedrängt werden, müssen diese wieder rein
			if (x_Position > 399) {
				x_Position = 399;
			}
			if (y_Position > 399) {
				y_Position = 399;
			}

			if (x_Position < 1) {
				x_Position = 1;
			}
			if (y_Position < 1) {
				y_Position = 1;
			}
		}

		{//Mausbewegung --> Kreise können im Mauskreis sein --> müssen raus fliegen
			if ((x_Position > mouse_X - radius_mouse)&&(x_Position < mouse_X + radius_mouse)
					&&(y_Position > mouse_Y - radius_mouse)&&(y_Position < mouse_Y + radius_mouse)) {
				x_Position = x_Position + radius_mouse - (Math.abs(x_Position - mouse_X));
				y_Position = y_Position + radius_mouse - (Math.abs(x_Position - mouse_Y));	
			}else if ((x_Position < mouse_X + radius_mouse)&&(x_Position > mouse_X - radius_mouse)
					&&(y_Position < mouse_Y + radius_mouse)&&(y_Position > mouse_Y - radius_mouse)) {
				x_Position = x_Position + radius_mouse + (Math.abs(x_Position - mouse_X));
				y_Position = y_Position + radius_mouse + (Math.abs(x_Position - mouse_Y));			
			}
		}

		//Aenderung der Position, bei potentiellen Berührungen des Mauskreises
		if ((x_Position + radius + x_Bewegung > mouse_X - radius_mouse)
				&&(x_Position + radius + x_Bewegung < mouse_X + radius_mouse)
				&&(y_Position + radius + y_Bewegung > mouse_Y - radius_mouse)
				&&(y_Position + radius + y_Bewegung < mouse_Y + radius_mouse)) {
			x_Bewegung *= -1;
			y_Bewegung *= -1;
		}else if ((x_Position + radius + x_Bewegung < mouse_X + radius_mouse)
				&&(x_Position + radius + x_Bewegung > mouse_X - radius_mouse)
				&&(y_Position + radius + x_Bewegung < mouse_Y + radius_mouse)
				&&(y_Position + radius + x_Bewegung > mouse_Y - radius_mouse)) {
			x_Bewegung *= 1;
			y_Bewegung *= 1;
		}

		{//Zeichnen der Kreise
			{//Aenderung der Position
				//Ränder --> Richtung * -1
				if (x_Position + radius + x_Bewegung > 400 || x_Position - radius + x_Bewegung < 0) {
					x_Bewegung *= -1;
				}
				if (y_Position + radius + y_Bewegung > 400 || y_Position - radius + y_Bewegung < 0) {
					y_Bewegung *= -1;
				}

				//Aenderung der Position
				x_Position += x_Bewegung;
				y_Position += y_Bewegung;
			}

			front.beginPath();
			front.arc(x_Position, y_Position, radius, 0, Math.PI * 2, true);
			front.closePath();
			front.stroke();
		}
	}

	public static void draw_Mauskreis(Context2d front, int mouse_X, int mouse_Y, int radius_mouse){
		front.beginPath();
		front.arc(mouse_X, mouse_Y, radius_mouse, 0, Math.PI * 2, true);
		front.closePath();
		front.setFillStyle("red");
		front.fill();
	}

	public void update_Fallen(Context2d front) {
		front.beginPath();

		{//Raender --> Richtung * -1
			if (y_Position - radius + y_Bewegung < max_hoehe) {
				y_Bewegung *= -1;
			}

			if (y_Position + radius + y_Bewegung > 400) {
				y_Bewegung *= -0.3;
				max_hoehe += 0.7 * 400 - max_hoehe;
			}
		}

		//Aenderung der Position
		x_Position += x_Bewegung;
		y_Position += y_Bewegung;

		front.arc(x_Position, y_Position, radius, 0, Math.PI * 2, true);

		front.closePath();
		front.stroke();
	}
}